10 REM *** (FFT8.02A) Q=2^N POINT FFT ***

12 CLS : PRINT : PRINT "INPUT NUMBER OF DATA POINTS AS 2^N"

14 INPUT "N = "; N

16 Q = 2 ^ N

20 Q2 = Q / 2: Q3 = Q2 - 1: Q4 = Q / 4: Q5 = Q4 - 1: Q8 = Q / 8

22 DIM Y(Q), C(2, Q), S(2, Q), KC(Q), KS(Q)

30 PI = 3.141592653589793#: P2 = 2 * PI: K1 = P2 / Q

32 FOR I = 0 TO Q: KC(I) = COS(K1 * I): KS(I) = SIN(K1 * I): NEXT

40 CLS

50 PRINT SPC(30); "MAIN MENU": PRINT : PRINT

60 PRINT SPC(5); "1 = ANALYZE Q/2 COMPONENT TRIANGLE": PRINT

64 PRINT SPC(5); "2 = EXIT": PRINT

70 PRINT SPC(10); "MAKE SELECTION :";

80 A$ = INKEY$: IF A$ = "" THEN 80

90 A = VAL(A$): ON A GOSUB 600, 990

95 GOTO 40

100 REM *** FFT ***

102 CLS : PRINT "FREQ   F(COS)       F(SIN)       ";

105 PRINT "FREQ   F(COS)       F(SIN)": PRINT : PRINT

106 T9 = TIMER

181 REM *** FFT ROUTINE ***

182 FOR M = 0 TO N - 1: QT = 2 ^ M: KT1 = 2 ^ (N - M - 1)

183 REM *** UNIVERSAL BUTTERFLY ***

184 FOR J = 0 TO Q3 STEP QT: J1 = 2 * J: K9 = J + Q2

185 FOR I = 0 TO QT - 1: KT = I * KT1: K = K9 + I

187 C(T0, J1 + I) = (C(T1, I + J) + C(T1, K) * KC(KT) - S(T1, K) * KS(KT)) / 2

188 S(T0, J1 + I) = (S(T1, I + J) + C(T1, K) * KS(KT) + S(T1, K) * KC(KT)) / 2

190 NEXT I

191 J1 = J1 + QT

192 FOR I = 0 TO QT - 1: KT = (I + QT) * KT1: K = K9 + I

194 C(T0, J1 + I) = (C(T1, I + J) + C(T1, K) * KC(KT) - S(T1, K) * KS(KT)) / 2

195 S(T0, J1 + I) = (S(T1, I + J) + C(T1, K) * KS(KT) + S(T1, K) * KC(KT)) / 2

196 NEXT I: NEXT J

197 IF T0 = 0 THEN T0 = 1: T1 = 0: GOTO 199

198 T0 = 0: T1 = 1

199 NEXT M

200 T9 = TIMER - T9

210 FOR Z = 0 TO Q2 - 1

215 GOSUB 300

220 NEXT Z

222 PRINT : PRINT "TIME ="; T9

225 PRINT : PRINT : INPUT "C/R TO CONTINUE:"; A$

230 RETURN

300 PRINT USING "###"; Z; : PRINT "   ";

310 PRINT USING "+##.#####"; C(T1, Z); : PRINT "    ";

312 PRINT USING "+##.#####"; S(T1, Z); : PRINT "      ";

320 PRINT USING "###"; Z + Q2; : PRINT "   ";

322 PRINT USING "+##.#####"; C(T1, Z + Q2); : PRINT "    ";

324 PRINT USING "+##.#####"; S(T1, Z + Q2)

330 RETURN

400 REM GENERATE 7 COMPONENT TRIANGLE

410 FOR I = 0 TO Q: C(0, I) = 0: S(0, I) = 0

420 FOR J = 1 TO Q / 2 STEP 2: C(0, I) = C(0, I) + COS(K1 * J * I) / (J * J): NEXT

422 IF INT(I / 4) = I / 4 THEN GOSUB 500

430 NEXT

440 RETURN

500 REM *** BLINK WAIT MESSAGE ***

510 CLS

520 FOR K = 1 TO 500: NEXT

530 LOCATE 10, 22

540 PRINT "PREPARING DATA - PLEASE WAIT"

550 RETURN

600 REM * Q/2 COMPONENT TRIANGLE *

602 CLS : PRINT : PRINT

604 PRINT "PREPARING DATA INPUT - PLEASE WAIT!"

610 GOSUB 400

612 T0 = 1: T1 = 0

614 PRINT : INPUT "DATA READY - C/R TO CONTINUE"; A$

620 GOSUB 100

630 RETURN

990 END



